package com.xinqi.test;



/**
 * @author xin麒
 * @date 2023/8/12 20:03
 */
/*
public class Demo {
    private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
                                                       DefaultBootstrapContext bootstrapContext, ApplicationArguments applicationArguments) {
        */
/**
         * 1、创建 ConfigurableEnvironment 对象：首先调用 getOrCreateEnvironment() 方法获取或创建
         * ConfigurableEnvironment 对象，该对象用于存储环境参数。如果已经存在 ConfigurableEnvironment 对象，则直接使用它；否则，根据用户的配置和默认配置创建一个新的。
         *//*

        ConfigurableEnvironment environment = getOrCreateEnvironment();
        */
/**
         * 2、解析并加载用户指定的配置文件，将其作为 PropertySource 添加到环境对象中。该方法默认会解析 application.properties 和 application.yml 文件，并将其添加到 ConfigurableEnvironment 对象中。
         * PropertySource 或 PropertySourcesPlaceholderConfigurer 加载应用程序的定制化配置。
         *//*

        configureEnvironment(environment, applicationArguments.getSourceArgs());
        // 3、加载所有的系统属性，并将它们添加到 ConfigurableEnvironment 对象中
        ConfigurationPropertySources.attach(environment);
        // 4、通知监听器环境参数已经准备就绪
        listeners.environmentPrepared(bootstrapContext, environment);
        */
/**
         *  5、将默认的属性源中的所有属性值移到环境对象的队列末尾，
         这样用户自定义的属性值就可以覆盖默认的属性值。这是为了避免用户无意中覆盖了 Spring Boot 所提供的默认属性。
         *//*

        DefaultPropertiesPropertySource.moveToEnd(environment);
        Assert.state(!environment.containsProperty("spring.main.environment-prefix"),
                "Environment prefix cannot be set via properties.");
        // 6、将 Spring Boot 应用程序的属性绑定到环境对象上，以便能够正确地读取和使用这些配置属性
        bindToSpringApplication(environment);
        // 7、如果没有自定义的环境类型，则使用 EnvironmentConverter 类型将环境对象转换为标准的环境类型，并添加到 ConfigurableEnvironment 对象中。
        if (!this.isCustomEnvironment) {
            EnvironmentConverter environmentConverter = new EnvironmentConverter(getClassLoader());
            environment = environmentConverter.convertEnvironmentIfNecessary(environment, deduceEnvironmentClass());
        }
        // 8、再次加载系统配置，以防止被其他配置覆盖
        ConfigurationPropertySources.attach(environment);
        return environment;
    }
}
*/
